iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

C++ AI 起步:編程進入智能世界系列 第 32

遊戲AI 演算法:八皇后演算法

  • 分享至 

  • xImage
  •  

八皇后問題是回溯法中的經典問題之一。這個問題的目標是在8x8的國際象棋棋盤上放置八個皇后,使得它們不能互相攻擊。換句話說,任何兩個皇后都不應該位於同一列、同一行或同一對角線上。

問題描述
給定一個N x N的棋盤(在此為8x8),目標是放置N個皇后,使得沒有兩個皇后在同一列、同一行或同一對角線上。

演算法描述

  1. 開始從第一列開始。
  2. 在當前列的每一行中,放置一個皇后並檢查是否合適。
  3. 如果放置是有效的,則繼續到下一列。
  4. 如果放置皇后在當前列的所有行都不合適,則回到上一列並移動皇后到下一行。
  5. 重複以上步驟,直到所有皇后都被放置或返回到第一列。

C++ 實現

#include <iostream>
#include <vector>

#define N 8

bool isSafe(std::vector<std::vector<int>>& board, int row, int col) {
    int i, j;

    // 檢查此列上方
    for (i = 0; i < col; i++)
        if (board[row][i])
            return false;

    // 檢查左上方對角線
    for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
        if (board[i][j])
            return false;

    // 檢查左下方對角線
    for (i = row, j = col; j >= 0 && i < N; i++, j--)
        if (board[i][j])
            return false;

    return true;
}

bool solveNQUtil(std::vector<std::vector<int>>& board, int col) {
    if (col >= N)
        return true;

    for (int i = 0; i < N; i++) {
        if (isSafe(board, i, col)) {
            board[i][col] = 1;

            if (solveNQUtil(board, col + 1))
                return true;

            board[i][col] = 0;  // 回溯
        }
    }

    return false;
}

void printSolution(std::vector<std::vector<int>>& board) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            std::cout << board[i][j] << " ";
        std::cout << std::endl;
    }
}

int main() {
    std::vector<std::vector<int>> board(N, std::vector<int>(N, 0));

    if (!solveNQUtil(board, 0))
        std::cout << "Solution does not exist";
    else
        printSolution(board);

    return 0;
}

當此代碼運行時,它會輸出一個解決方案,其中皇后的放置不會對彼此構成威脅。

總結
八皇后問題展示了回溯演算法的強大之處,可以使用相似的策略來解決其他N皇后問題或類似的問題。這種方法的核心思想是嘗試並檢查結果,並在需要時進行回溯以尋找其他可能的解決方案。


上一篇
遊戲AI 演算法:回溯法- 老鼠走迷宮
系列文
C++ AI 起步:編程進入智能世界32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言